/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tp2.etna.exportacion.controller;

import com.tp2.etna.costos.modelo.PeriodoModel;
import com.tp2.etna.exportacion.constante.ExportacionConstantes;
import com.tp2.etna.exportacion.modelo.DetalleDocumentoExportacionModel;
import com.tp2.etna.exportacion.modelo.DetalleRequerimientoModel;
import com.tp2.etna.exportacion.modelo.DocumentoExportacionModel;
import com.tp2.etna.exportacion.modelo.DocumentoSicexModel;
import com.tp2.etna.exportacion.modelo.RequerimientoModel;
import com.tp2.etna.exportacion.modelo.SolicitudAtencionModel;
import com.tp2.etna.exportacion.service.DocumentoExportacionService;
import com.tp2.etna.exportacion.service.RequerimientoService;
import com.tp2.etna.exportacion.service.SolicitudAtencionService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ExportacionController {

    @Autowired
    private SolicitudAtencionService SolicitudAtencionService;

    @Autowired
    private RequerimientoService RequerimientoService;

    @Autowired
    private DocumentoExportacionService DocumentoExportacionService;

    @RequestMapping(value = "/consultaSolicitud", method = RequestMethod.GET)
    public ModelAndView consultaSolicitud() {

        ModelAndView modelo = new ModelAndView("exportacion_consulta");
        return modelo;
    }

    @RequestMapping(value = "/consultaAprobarSolicitud", method = RequestMethod.GET)
    public ModelAndView consultaAprobarSolicitud() {

        ModelAndView modelo = new ModelAndView("exportacion_aprobarconsulta");
        return modelo;
    }

    @RequestMapping(value = "/Nuevo", method = RequestMethod.GET)
    public ModelAndView nuevo(HttpSession session) {

        ModelAndView modelo = new ModelAndView("exportacion_nuevasolicitud");
        session.setAttribute("documentosExportacion", null);
        return modelo;
    }

    @RequestMapping(value = "/Editar", method = RequestMethod.GET)
    public ModelAndView editar(@RequestParam(required = false) Integer codigo, HttpSession session) {
        System.out.println("Codigo: " + codigo.toString());
        SolicitudAtencionModel solicitud = SolicitudAtencionService.SolicitudById(codigo);
        RequerimientoModel requerimiento = RequerimientoService.buscarRequerimiento(solicitud.getCodigoRequerimiento());

        ModelAndView modelo = new ModelAndView("exportacion_actualizasolicitud", "solicitud", solicitud);
        modelo.addObject("requerimiento", requerimiento);
        modelo.addObject("editar", 1);

        List<DetalleRequerimientoModel> detalleRequerimiento = RequerimientoService.detalleRequerimiento(solicitud.getCodigoRequerimiento());
        List<DocumentoExportacionModel> documentosExportacion = new ArrayList<DocumentoExportacionModel>();

        for (DetalleRequerimientoModel itm : detalleRequerimiento) {
            DocumentoExportacionModel docnewitm = new DocumentoExportacionModel();
            docnewitm.setCodigoRequerimientoDet(itm.getCodigoRequerimientoDet());

            List<DetalleDocumentoExportacionModel> detalledocExp = DocumentoExportacionService.listarDocumentosAsociados(codigo);
            docnewitm.setDetalleDocumentoExportacion(detalledocExp);
            documentosExportacion.add(docnewitm);
        }

        System.out.println("Documentos Encontrado" + documentosExportacion.size());
        
        session.setAttribute("documentosExportacion", documentosExportacion);

        return modelo;
    }

    @RequestMapping(value = "/Visualizar", method = RequestMethod.GET)
    public ModelAndView visualizar(@RequestParam(required = false) Integer codigo) {
        System.out.println("Codigo: " + codigo.toString());
        SolicitudAtencionModel solicitud = SolicitudAtencionService.SolicitudById(codigo);
        RequerimientoModel requerimiento = RequerimientoService.buscarRequerimiento(solicitud.getCodigoRequerimiento());

        ModelAndView modelo = new ModelAndView("exportacion_actualizasolicitud", "solicitud", solicitud);
        modelo.addObject("requerimiento", requerimiento);
        modelo.addObject("editar", 0);
        return modelo;
    }

    @RequestMapping(value = "/VerDetalleReq", method = RequestMethod.GET)
    public ModelAndView verDetalleReq(@RequestParam(required = false) Integer codigosolicitud) {
        SolicitudAtencionModel solicitud = SolicitudAtencionService.SolicitudById(codigosolicitud);
        RequerimientoModel requerimiento = RequerimientoService.buscarRequerimiento(solicitud.getCodigoRequerimiento());

        ModelAndView modelo = new ModelAndView("exportacion_verdetallereq", "solicitud", solicitud);
        modelo.addObject("requerimiento", requerimiento);

        return modelo;
    }

    @RequestMapping(value = "/exportacion/ConsultarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<SolicitudAtencionModel> consultarSolicitud(
            @RequestParam(required = false) String cliente,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date fechadesde,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date fechahasta) {

        return SolicitudAtencionService.consultaSolicitud(cliente, fechadesde, fechahasta);
    }

    @RequestMapping(value = "/exportacion/ConsultarAprobarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<SolicitudAtencionModel> consultarAprobarSolicitud(
            @RequestParam(required = false) String estado,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date fechadesde,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date fechahasta) {

        return SolicitudAtencionService.consultaAprobarSolicitud(estado, fechadesde, fechahasta);
    }

    @RequestMapping(value = "/exportacion/BuscarRequerimiento", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    RequerimientoModel buscarRequerimiento(
            @RequestParam(required = false) Integer codigorequerimiento) {

        return RequerimientoService.buscarRequerimiento(codigorequerimiento);

    }

    @RequestMapping(value = "/exportacion/DetalleRequerimientoId", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    DetalleRequerimientoModel detalleRequerimientoId(
            @RequestParam(required = false) Integer codigorequerimientodet) {

        return RequerimientoService.DetalleRequerimientoById(codigorequerimientodet);

    }

    @RequestMapping(value = "/exportacion/ListarRequerimiento", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<RequerimientoModel> listarRequerimiento(
            @RequestParam(required = false) Integer codigorequerimiento,
            @RequestParam(required = false) String reqrazonsocial,
            @RequestParam(required = false) String reqruc,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date reqfechadesde,
            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date reqfechahasta) {

        return RequerimientoService.listarRequerimiento(codigorequerimiento, reqrazonsocial, reqruc, reqfechadesde, reqfechahasta);

    }

    @RequestMapping(value = "/exportacion/DetalleRequerimiento", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<DetalleRequerimientoModel> detalleRequerimiento(
            @RequestParam(required = false) Integer codigorequerimiento) {

        return RequerimientoService.detalleRequerimiento(codigorequerimiento);
    }

    @RequestMapping(value = "/exportacion/ListarDocumentosSicex", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<DocumentoSicexModel> listarDocumentosSicex(
            @RequestParam(required = false) Integer codigorequerimientodet,
            HttpSession session) {

        List<DocumentoSicexModel> DocumentosSicex = RequerimientoService.listarDocumentosSicex();
        List<DocumentoExportacionModel> documentosExportacion = (List<DocumentoExportacionModel>) session.getAttribute("documentosExportacion");
        if (documentosExportacion != null) {
            System.out.println("Documentos en Sesion" + documentosExportacion.size());
        }
        System.out.println("Documentos Sicex " + DocumentosSicex.size());
        System.out.println("CodigoRequerimientoDet: " + codigorequerimientodet);
        if (documentosExportacion != null) {
            for (DocumentoExportacionModel itm : documentosExportacion) {
                System.out.println("CodigoRequerimientoDetDocExp: " + itm.getCodigoRequerimientoDet());
                if (itm.getCodigoRequerimientoDet() == codigorequerimientodet) {
                    System.out.println("EncontroCodigoRequerimiento");
                    for (DocumentoSicexModel itmdoc : DocumentosSicex) {
                        if (itm.getDetalleDocumentoExportacion() != null) {
                            System.out.println("Detalle Documento Exportacion: " + itm.getDetalleDocumentoExportacion().size());
                            for (DetalleDocumentoExportacionModel itmdocexp : itm.getDetalleDocumentoExportacion()) {
                                if (itmdoc.getCodigo() == itmdocexp.getCodigoDocumentoSicex()) {
                                    System.out.println("Se selecciono");
                                    itmdoc.setSeleccionado(1);
                                }
                            }
                        }
                    }
                    break;
                }
            }
            return DocumentosSicex;
        } else {
            return DocumentosSicex;
        }
    }

    @RequestMapping(value = "/exportacion/AgregarQuitarDoc", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer agregarQuitarDoc(
            @RequestParam(required = false) Integer codigorequerimientodet,
            @RequestParam(required = false) Integer codigodocumentosicex,
            @RequestParam(required = false) Integer agregar,
            HttpSession session) {
        System.out.println("Inicio ");
        System.out.println("Codigoreq: " + codigorequerimientodet.toString() + "," + codigodocumentosicex.toString() + "," + agregar.toString());
        List<DocumentoExportacionModel> documentosExportacion = (List<DocumentoExportacionModel>) session.getAttribute("documentosExportacion");

        if (documentosExportacion == null) {
            documentosExportacion = new ArrayList<DocumentoExportacionModel>();
            if (agregar == 1) {
                DetalleDocumentoExportacionModel newitmdoc = new DetalleDocumentoExportacionModel();
                newitmdoc.setCodigoDocumentoSicex(codigodocumentosicex);

                DocumentoExportacionModel newitm = new DocumentoExportacionModel();
                newitm.setCodigoRequerimientoDet(codigorequerimientodet);
                List<DetalleDocumentoExportacionModel> newdetdocs = newitm.getDetalleDocumentoExportacion();
                if (newdetdocs == null) {
                    newdetdocs = new ArrayList<DetalleDocumentoExportacionModel>();
                }
                newdetdocs.add(newitmdoc);

                newitm.setDetalleDocumentoExportacion(newdetdocs);
                documentosExportacion.add(newitm);
            }
            session.setAttribute("documentosExportacion", documentosExportacion);
            System.out.println("Items New: " + documentosExportacion.size());
        } else {
            if (agregar == 1) {
                Boolean encontro = false;

                //Verificar si el detalle de requerimiento ya existe:
                DocumentoExportacionModel newitm = new DocumentoExportacionModel();
                newitm.setCodigoRequerimientoDet(codigorequerimientodet);
                for (DocumentoExportacionModel itm : documentosExportacion) {
                    if (itm.getCodigoRequerimientoDet() == codigorequerimientodet) {
                        encontro = true;
                        newitm = itm;
                        break;
                    }
                }

                List<DetalleDocumentoExportacionModel> newdetdocs = new ArrayList<DetalleDocumentoExportacionModel>();
                if (encontro) {
                    newdetdocs = newitm.getDetalleDocumentoExportacion();
                }

                //Crear el documento detalle
                DetalleDocumentoExportacionModel newitmdoc = new DetalleDocumentoExportacionModel();
                newitmdoc.setCodigoDocumentoSicex(codigodocumentosicex);

                //Crear el documento cabecera               
                newdetdocs.add(newitmdoc);
                newitm.setDetalleDocumentoExportacion(newdetdocs);
                if (!encontro) {
                    documentosExportacion.add(newitm);
                } 

                session.setAttribute("documentosExportacion", documentosExportacion);
                System.out.println("Items Modif: " + documentosExportacion.size());
            } else {
                List<DocumentoExportacionModel> documentosExportacionModif = new ArrayList<DocumentoExportacionModel>();
                for (DocumentoExportacionModel newitm : documentosExportacion) {
                    if (newitm.getCodigoRequerimientoDet() != codigorequerimientodet) {
                        documentosExportacionModif.add(newitm);
                    } else {
                        DocumentoExportacionModel newitmmodif = new DocumentoExportacionModel();
                        newitmmodif.setCodigoRequerimientoDet(codigorequerimientodet);
                        List<DetalleDocumentoExportacionModel> itmsdocs = new ArrayList<DetalleDocumentoExportacionModel>();
                        for (DetalleDocumentoExportacionModel newitmdet : newitm.getDetalleDocumentoExportacion()) {
                            if (newitmdet.getCodigoDocumentoSicex() != codigodocumentosicex) {
                                itmsdocs.add(newitmdet);
                            }
                        }
                        newitmmodif.setDetalleDocumentoExportacion(itmsdocs);
                        documentosExportacionModif.add(newitmmodif);
                    }
                }
                session.setAttribute("documentosExportacion", documentosExportacionModif);
                System.out.println("Items Remove Modif: " + documentosExportacionModif.size());
            }
        }

        return 0;
    }

    @RequestMapping(value = "/exportacion/AgregarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer agregarSolicitud(
            @RequestParam(required = false) Integer codigorequerimiento,
            @RequestParam(required = false) String responsable,
            @RequestParam(required = false) String observaciones,
            HttpSession session
    ) {
        List<DocumentoExportacionModel> documentosExportacion = (List<DocumentoExportacionModel>) session.getAttribute("documentosExportacion");

        SolicitudAtencionModel solicitudAtencion = new SolicitudAtencionModel();
        solicitudAtencion.setCodigoRequerimiento(codigorequerimiento);
        solicitudAtencion.setResponsable(responsable);
        solicitudAtencion.setObservaciones(observaciones);
        solicitudAtencion.setEstado(ExportacionConstantes.ESTADO_CREADO);
        solicitudAtencion.setDocumentoExportacion(documentosExportacion);

        Integer resul = 1;
        if (SolicitudAtencionService.AgregarSolicitud(solicitudAtencion)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/ActualizarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer actualizarSolicitud(
            @RequestParam(required = false) Integer codigo,
            @RequestParam(required = false) String responsable,
            @RequestParam(required = false) String observaciones
    ) {

        SolicitudAtencionModel solicitudAtencion = new SolicitudAtencionModel();
        solicitudAtencion.setCodigo(codigo);
        solicitudAtencion.setResponsable(responsable);
        solicitudAtencion.setObservaciones(observaciones);

        Integer resul = 1;
        if (SolicitudAtencionService.ActualizarSolicitud(solicitudAtencion)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/AnularSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer anularSolicitud(@RequestParam(required = false) Integer codigo) {

        Integer resul = 1;
        if (SolicitudAtencionService.ActualizarEstadoSolicitud(codigo, ExportacionConstantes.ESTADO_ANULADO)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/RechazarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer rechazarSolicitud(@RequestParam(required = false) Integer codigo) {

        Integer resul = 1;
        if (SolicitudAtencionService.ActualizarEstadoSolicitud(codigo, ExportacionConstantes.ESTADO_RECHAZADA)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/AprobarSolicitud", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer aprobarSolicitud(@RequestParam(required = false) Integer codigo) {

        Integer resul = 1;
        if (SolicitudAtencionService.ActualizarEstadoSolicitud(codigo, ExportacionConstantes.ESTADO_APROBADA)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/RechazarDetalleRequerimiento", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer rechazarDetalleRequerimiento(@RequestParam(required = false) Integer codigorequerimientodet) {

        Integer resul = 1;
        if (RequerimientoService.ActualizarEstadoDetalleRequerimiento(codigorequerimientodet, ExportacionConstantes.ESTADO_RECHAZADA)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/AprobarDetalleRequerimiento", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer aprobarDetalleRequerimiento(@RequestParam(required = false) Integer codigorequerimientodet) {

        Integer resul = 1;
        if (RequerimientoService.ActualizarEstadoDetalleRequerimiento(codigorequerimientodet, ExportacionConstantes.ESTADO_APROBADA)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/AprobarDesaprobarDetalleDoc", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    Integer aprobarDetalleRequerimiento(@RequestParam(required = false) Integer codigo, Integer flgaprobar) {

        Integer resul = 1;
        if (DocumentoExportacionService.ActualizarFlagDetalleDocumentoExportacion(codigo, flgaprobar)) {
            resul = 0;
        }

        return resul;
    }

    @RequestMapping(value = "/exportacion/ListarDocumentoAsociados", method = RequestMethod.GET, produces = {"application/json"})
    public @ResponseBody
    List<DetalleDocumentoExportacionModel> listarDocumentoAsociados(
            @RequestParam(required = false) Integer codigorequerimientodet) {

        return DocumentoExportacionService.listarDocumentosAsociados(codigorequerimientodet);

    }

}
